package com.nowcoder.community.controller;

import com.nowcoder.community.entity.*;
import com.nowcoder.community.event.EventProducer;
import com.nowcoder.community.service.CommentService;
import com.nowcoder.community.service.DiscussPostService;
import com.nowcoder.community.service.LikeService;
import com.nowcoder.community.service.UserService;
import com.nowcoder.community.util.CommunityConstant;
import com.nowcoder.community.util.CommunityUtil;
import com.nowcoder.community.util.HostHolder;
import com.nowcoder.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * <p>Title: DiscussPostController</p>
 * <p>author 12427</p>
 *
 * @version ver1.0
 * @date 2022/8/17 14:51
 */
@Controller
@RequestMapping("/discuss")
public class DiscussPostController implements CommunityConstant{
    @Autowired
    private  DiscussPostService  discussPostService ;

    @Autowired
    private HostHolder hostHolder ;

    @Autowired
    private UserService userService ;

    @Autowired
    private CommentService commentService ;
    
    @Autowired
    private LikeService likeService ;

    @Autowired
    private EventProducer eventProducer ;


    @Autowired
    private RedisTemplate redisTemplate ;


    @RequestMapping(path = "/add" , method = RequestMethod.POST)
    @ResponseBody
    public String addDiscussPost(String title , String content){

        User user = hostHolder.getUser() ;
        if(user == null){
            // 403 代表没有权限
            return CommunityUtil.getJSONString(403 ,  "你还没有登录~") ;
        }

        DiscussPost post = new DiscussPost() ;
        post.setUserId(user.getId());
        post.setTitle(title) ;
        post.setContent(content);
        post.setCreateTime(new Date());
        discussPostService.addDiscussPost(post) ;

        // 触发发帖事件
        Event event  = new Event()
                .setTopic(TOPIC_PUBLISH)
                .setUserId(user.getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(post.getId()) ;

        eventProducer.fireEvent(event);


        // 计算帖子的分数
        String redisKey = RedisKeyUtil.getPostScoreKey() ;
        redisTemplate.opsForSet().add(redisKey , post.getId()) ;


        // 报错的情况，未来统一处理
        return CommunityUtil.getJSONString(0 , "发布成功!") ;

    }

    @RequestMapping(path = "/detail/{discussPostId}" , method = RequestMethod.GET)
    public String getDiscussPost(@PathVariable("discussPostId") int discussPostId , Model model , Page page){
        // 查询帖子
        DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
        model.addAttribute("post" , post) ;

        // 查询帖子的作者
        User user = userService.findUserById(post.getUserId());
        model.addAttribute("user" , user) ;

        // 点赞数量
        long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, discussPostId);
        model.addAttribute("likeCount"  ,likeCount) ;

        // 点赞状态
        int likeStatus =  hostHolder.getUser() == null ? 0 :
                likeService.findEntityLikeStatus( hostHolder.getUser().getId() ,ENTITY_TYPE_POST , discussPostId) ;
        model.addAttribute("likeStatus" , likeStatus) ;


        // 评论的分页信息
        page.setLimit(5);
        page.setPath("/discuss/detail/" +  discussPostId);
        page.setRows(post.getCommentCount());
        
        // 评论：给帖子的评论
        // 回复：给评论的评论

        /**
         *
         * commentVoList
         *               |_ commentVo
         *                         |_ comment
         *                         |_ user
         *                        |_ replyCount
         *                        |
         *                        |_replyVoList
         *                                      |_ replyVo
         *                                              |_ target
         *                                              |_ user
         *                                              |_ reply
         *
         */

        // 评论列表
        List<Comment> commentList = commentService.findCommentByEntity(ENTITY_TYPE_POST, post.getId(), 
                page.getOffset(), page.getLimit());
        
        // 评论的显式对象的列表
        List<Map<String,Object>> commentVoList = new ArrayList<>() ;
        if(commentList != null) {
            for(Comment comment : commentList){

                // map 是一个评论的Vo
                Map<String,Object> commentVo = new HashMap<>() ;

                // 填加一个评论
                commentVo.put("comment" , comment) ;
                // 添加一个评论的作者
                commentVo.put("user" , userService.findUserById(comment.getUserId())) ;

                // 点赞数量
                likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT, comment.getId());
                commentVo.put("likeCount"  ,likeCount) ;

                // 点赞状态
                likeStatus =  hostHolder.getUser() == null ? 0 :
                        likeService.findEntityLikeStatus( hostHolder.getUser().getId() ,ENTITY_TYPE_COMMENT , comment.getId()) ;
                commentVo.put("likeStatus" , likeStatus) ;


                // 回复列表
                // 从头显示到尾
                List<Comment> replyList = commentService.findCommentByEntity(ENTITY_TYPE_COMMENT,
                        comment.getId(), 0, Integer.MAX_VALUE);
                List<Map<String,Object>> replyVoList = new ArrayList<>() ;

                if(replyList != null) {
                    for(Comment reply : replyList) {
                        Map<String,Object> replyVo = new HashMap<>() ;
                        replyVo.put("reply" , reply) ;
                        replyVo.put("user" , userService.findUserById(reply.getUserId())) ;

                        // 点赞数量
                        likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT, reply.getId());
                        replyVo.put("likeCount"  ,likeCount) ;

                        // 点赞状态
                        likeStatus =  hostHolder.getUser() == null ? 0 :
                                likeService.findEntityLikeStatus( hostHolder.getUser().getId() ,ENTITY_TYPE_COMMENT , reply.getId()) ;
                        replyVo.put("likeStatus" , likeStatus) ;

                        // 回复目标
                        User target = reply.getTargetId() == 0 ? null : userService.findUserById(reply.getTargetId());
                        replyVo.put("target" , target) ;
                        replyVoList.add(replyVo) ;
                    }
                }
                commentVo.put("replys" , replyVoList) ;

                // 回复的数量
                int replyCount = commentService.findCommentCount(ENTITY_TYPE_COMMENT, comment.getId());
                commentVo.put("replyCount" , replyCount) ;

                commentVoList.add(commentVo) ;
            }

        }

        model.addAttribute("comments" , commentVoList ) ;

        return "/site/discuss-detail" ;

    }


    // 置顶
    @RequestMapping(path = "/top" , method = RequestMethod.POST)
    @ResponseBody
    public String setTop(int id){
        // 置顶的类型是1
        discussPostService.updateType(id , 1) ;


        // 触发发帖事件
        Event event  = new Event()
                .setTopic(TOPIC_PUBLISH)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id) ;

        eventProducer.fireEvent(event);

        return CommunityUtil.getJSONString(0) ;

    }


    // 加精
    @RequestMapping(path = "/wonderful" , method = RequestMethod.POST)
    @ResponseBody
    public String setWonderful(int id){
        // 加精的状态是1
        discussPostService.updateStatus(id , 1) ;


        // 触发发帖事件
        Event event  = new Event()
                .setTopic(TOPIC_PUBLISH)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id) ;

        eventProducer.fireEvent(event);

        // 计算帖子的分数
        String redisKey = RedisKeyUtil.getPostScoreKey() ;
        redisTemplate.opsForSet().add(redisKey , id) ;


        return CommunityUtil.getJSONString(0) ;

    }

    // 删除
    @RequestMapping(path = "/delete" , method = RequestMethod.POST)
    @ResponseBody
    public String setDelete(int id){
        // 删除的状态是2
        discussPostService.updateStatus(id , 2) ;


        // 触发删帖事件
        Event event  = new Event()
                .setTopic(TOPIC_DELETE)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id) ;

        eventProducer.fireEvent(event);

        return CommunityUtil.getJSONString(0) ;

    }

}
